// PLC通过队列服务完整读取和写入测试脚本
const plcService = require('../client/src/services/plcService');

async function testPLCCompleteQueueOperations() {
  console.log('开始测试PLC通过队列服务完整读取和写入功能...');
  
  try {
    // 1. 检查PLC连接状态
    console.log('\n1. 检查PLC连接状态:');
    const status = await plcService.getStatus();
    console.log('PLC状态:', status);
    
    if (!status.connected) {
      console.log('⚠️ PLC未连接，尝试连接...');
      const connectResult = await plcService.connect();
      console.log('连接结果:', connectResult);
      
      if (!connectResult.connected) {
        throw new Error('无法连接到PLC');
      }
    }
    
    // 2. 加载PLC配置
    console.log('\n2. 加载PLC配置:');
    const config = await plcService.loadConfig();
    console.log('PLC配置加载成功');
    
    // 3. 确定要测试的变量
    let variablesToTest = [];
    if (config.variables && config.variables.length > 0) {
      variablesToTest = config.variables.slice(0, 3).map(v => v.address); // 取前3个变量
      console.log('从配置中获取变量地址:', variablesToTest);
    } else {
      // 如果配置中没有变量，使用默认变量
      variablesToTest = ['DB1,W0.0', 'DB1,W2.0', 'DB1,W4.0'];
      console.log('使用默认变量地址:', variablesToTest);
    }
    
    // 4. 通过队列服务读取变量（读取原始值）
    console.log('\n3. 通过队列服务读取变量原始值:');
    const originalValues = await plcService.readVariables(variablesToTest, true); // true表示使用队列服务
    console.log('原始值:', JSON.stringify(originalValues, null, 2));
    
    // 5. 通过队列服务写入新值
    console.log('\n4. 通过队列服务写入新值:');
    const testValues = [];
    for (let i = 0; i < variablesToTest.length; i++) {
      const variable = variablesToTest[i];
      // 生成测试值：整数、浮点数、布尔值交替
      let value;
      if (i % 3 === 0) {
        value = Math.floor(Math.random() * 1000); // 整数
      } else if (i % 3 === 1) {
        value = Math.random() * 100; // 浮点数
      } else {
        value = Math.random() > 0.5; // 布尔值
      }
      
      testValues.push({ variable, value });
      console.log(`  写入 ${variable} = ${value} (类型: ${typeof value})`);
      const writeResult = await plcService.writeVariable(variable, value);
      console.log(`  写入结果:`, writeResult);
    }
    
    // 6. 通过队列服务读取变量（验证写入是否成功）
    console.log('\n5. 通过队列服务读取变量，验证写入是否成功:');
    const newValues = await plcService.readVariables(variablesToTest, true);
    console.log('写入后读取的值:', JSON.stringify(newValues, null, 2));
    
    // 7. 验证写入的值是否正确
    console.log('\n6. 验证写入的值是否正确:');
    let allValuesMatch = true;
    for (const { variable, value } of testValues) {
      const readValue = newValues[variable];
      // 对于浮点数，允许小的误差
      let valuesMatch = false;
      if (typeof value === 'number' && typeof readValue === 'number') {
        valuesMatch = Math.abs(value - readValue) < 0.0001;
      } else {
        valuesMatch = value === readValue;
      }
      
      if (valuesMatch) {
        console.log(`  ✅ ${variable}: 写入值 ${value} === 读取值 ${readValue}`);
      } else {
        console.log(`  ❌ ${variable}: 写入值 ${value} !== 读取值 ${readValue}`);
        allValuesMatch = false;
      }
    }
    
    if (allValuesMatch) {
      console.log('\n✅ 所有值都正确写入和读取！');
    } else {
      console.log('\n⚠️ 部分值写入或读取不正确');
    }
    
    // 8. 恢复原始值（可选）
    console.log('\n7. 恢复原始值:');
    for (const variable of variablesToTest) {
      if (originalValues.hasOwnProperty(variable)) {
        const originalValue = originalValues[variable];
        console.log(`  恢复 ${variable} = ${originalValue}`);
        await plcService.writeVariable(variable, originalValue);
      }
    }
    
    console.log('\n✅ 所有队列读取和写入测试完成!');
  } catch (error) {
    console.error('❌ 测试过程中出现错误:', error);
  }
}

// 运行测试
testPLCCompleteQueueOperations();